package com.atguigu.tingshu.user.api;

import java.util.concurrent.CompletableFuture;
import java.util.concurrent.ExecutionException;

/**
 * @author atguigu-mqx
 * @ClassName DemoCompletableFuture
 * @description: TODO
 * @date 2024年06月04日
 * @version: 1.0
 */
public class DemoCompletableFuture {

    public static void main(String[] args) throws ExecutionException, InterruptedException {
        //  CompletableFuture -- 异步编排: 开启一个线程执行一个异步相对耗时的任务.
        //  如何创建一个CompletableFuture 对象 runAsync();  supplyAsync();
        //  hello -- 类似于开启一个线程去执行任务.
        //  CompletableFuture<Void> future = CompletableFuture.runAsync(() -> System.out.println("hello"));
        //  null 获取这个线程执行的结果.
        //  System.out.println(future.get());

        //  有返回值 whenComplete(); 计算完成时获取数据.
        CompletableFuture<Integer> supplyAsync = CompletableFuture.supplyAsync(() -> {
            //  计算---
            int total = 0;
            for (int i = 1; i <= 365; i++) {
                total += i;
            }
            int j = 1/0;
            return total;
        }).whenComplete((t, u) -> {
            //  66795 t:上一个线程执行的结果
            System.out.println(t);
            //  null u：表示是否有异常，补货异常的！
            System.out.println(u);
        }).exceptionally(t -> {
            System.out.println(t);
            return 404;
        });
        //  打印数据. 1
        System.out.println(supplyAsync.get());

        //  thenApplyAsync(); 获取上一个返回结果，并处理，再返回最后结果.
        //        CompletableFuture<Integer> supplyAsync = CompletableFuture.supplyAsync(() -> {
        //            //  计算---
        //            int total = 0;
        //            for (int i = 1; i <= 365; i++) {
        //                total+=i;
        //            }
        //            //  int j = 1/0;
        //            return total;
        //        }).thenApplyAsync(t -> {
        //            // 66795
        //            System.out.println(t);
        //            return 2*t;
        //        });
        //        System.out.println(supplyAsync.get());

        //        CompletableFuture<Void> futureA = CompletableFuture.runAsync(() -> {
        //            System.out.println("hello");
        //        });
//        CompletableFuture<String> futureA = CompletableFuture.supplyAsync(() -> "hello");
//        //  futureB
//        CompletableFuture<Void> futureB = futureA.thenAcceptAsync(s -> {
//            try {
//                Thread.sleep(3000);
//            } catch (InterruptedException e) {
//                throw new RuntimeException(e);
//            }
//            System.out.println(s + ":\tworld");
//        });
//
//        CompletableFuture<Void> futureC = futureA.thenAcceptAsync(s -> {
//            try {
//                Thread.sleep(1000);
//            } catch (InterruptedException e) {
//                throw new RuntimeException(e);
//            }
//            System.out.println(s + ":\tatguigu");
//        });
        //  --thenRunAsync()表示最后执行的任务.
        //        CompletableFuture<Void> futureB = futureA.thenRunAsync(() -> {
        //            System.out.println("world");
        //        });
//        System.out.println(futureA.get());
//        System.out.println(futureB.get());
//        System.out.println(futureC.get());
    }
}
